﻿using Ortodoctor.Componentes;
using Ortodoctor.modelo;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Ortodoctor.Funcionario
{
    public partial class Agendamento : System.Web.UI.Page
    {
        private long idClinica;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["USUARIO"] == null)
                Response.Redirect("Login.aspx");

            idClinica = (int)Session["ID_CLINICA"];

            pacienteSelect.Items.Clear();
            dentistaSelect.Items.Clear();

            CarregaClientes();
            CarregaDentistas();
        }

        private static string ConverDataTableToJSON(DataTable dt)
        {
            System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
            Dictionary<string, object> row;
            foreach (DataRow dr in dt.Rows)
            {                
                row = new Dictionary<string, object>();
                foreach (DataColumn col in dt.Columns)
                {
                    if (col.ColumnName == "horario" || col.ColumnName == "termino")
                        row.Add(col.ColumnName, ((DateTime)dr[col]).Hour + ":" + ((DateTime)dr[col]).Minute);
                    else if (dr[col].GetType() == typeof(DateTime))
                        row.Add(col.ColumnName, ((DateTime)dr[col]).ToShortDateString());
                    else
                        row.Add(col.ColumnName, dr[col]);
                }
                rows.Add(row);
            }
            return serializer.Serialize(rows);
        }

        [WebMethod]
        public static string GetAllAgendamentos()
        {
            return ConverDataTableToJSON(CarregaAgendamentos());

            return "";
        }

        protected void CarregaClientes()
        {
            modeloCliente modelo = new modeloCliente();
            DataTable dt = modelo.getAll();

            pacienteSelect.Items.Add(new ListItem(" -- Selecione um cliente ", "-1"));

            foreach (DataRow dr in dt.Rows)
                pacienteSelect.Items.Add(new ListItem(dr["nome"].ToString(), dr["id_cliente"].ToString(), true));

            pacienteSelect.SelectedIndex = 0;
        }

        protected static DataTable CarregaAgendamentos()
        {
            modeloAgendamento modelo = new modeloAgendamento();
            DataTable dt = modelo.getAll();
            return dt;
        }

        protected void CarregaDentistas()
        {
            modeloFuncionario modelo = new modeloFuncionario();
            DataTable dt = modelo.getAll();

            dentistaSelect.Items.Add(new ListItem(" -- Selecione um dentista ", "-1"));

            foreach (DataRow dr in dt.Rows)
                dentistaSelect.Items.Add(new ListItem(dr["nome"].ToString(), dr["id_funcionario"].ToString(), true));

            dentistaSelect.SelectedIndex = 0;
        }

        [WebMethod]
        public static string Insert(string obj)
        {
            Componentes.Agendamento agendamento = new JavaScriptSerializer().Deserialize<Componentes.Agendamento>(obj);
            modeloAgendamento ma = new modeloAgendamento();

            long idAgenda = ma.insert(agendamento);
            agendamento.Id_agenda = idAgenda;

            if (agendamento.Compareceu)
            {
                modeloComparecimento mc = new modeloComparecimento();
                mc.Insert(agendamento.IdCliente, agendamento.IdFuncionario, agendamento.Data.ToShortDateString(), idAgenda, agendamento.Horario.ToString(), agendamento.Horario, agendamento.Termino);
            }

            return new JavaScriptSerializer().Serialize(agendamento);
        }

        [WebMethod]
        public static string Edit(string obj)
        {
            Componentes.Agendamento agendamento = new JavaScriptSerializer().Deserialize<Componentes.Agendamento>(obj);
            modeloAgendamento ma = new modeloAgendamento();
             
            DataTable dt = ma.getAgendaPorId(agendamento.Id_agenda);
            Componentes.Agendamento agendamentoBanco = MontarAgenda(dt);

            if (agendamentoBanco.Compareceu && !agendamento.Compareceu)
                ma.removerComparecimento(agendamento.Id_agenda);
            else if (!agendamentoBanco.Compareceu && agendamento.Compareceu)
            {
                modeloComparecimento mc = new modeloComparecimento();
                mc.Insert(agendamento.IdCliente, agendamento.IdFuncionario, agendamento.Data.ToShortDateString(), agendamento.Id_agenda, agendamento.Horario.ToString(), agendamento.Horario, agendamento.Termino);
            }
            else if (agendamentoBanco.Compareceu && agendamento.Compareceu)
            {
                modeloComparecimento mc = new modeloComparecimento();
                mc.editar((int)agendamento.IdCliente, agendamento.IdFuncionario, agendamento.Horario.ToString(), Int32.Parse(HttpContext.Current.Session["ID_USUARIO_ACESSO"].ToString()), agendamento.Horario, agendamento.Termino, agendamento.Id_agenda);
            }

            ma = new modeloAgendamento();
            ma.editarAgenda(agendamento.Id_agenda, agendamento, Int32.Parse(HttpContext.Current.Session["ID_USUARIO_ACESSO"].ToString()));
            //agendamento.Id_agenda = idAgenda;

            //if (agendamento.Compareceu)
            //{
            //    modeloComparecimento mc = new modeloComparecimento();
            //    mc.Insert(agendamento.IdCliente, agendamento.IdFuncionario, agendamento.Data.ToShortDateString(), idAgenda, agendamento.Horario.ToString(), agendamento.Horario, agendamento.Termino);
            //}

            //return new JavaScriptSerializer().Serialize(agendamento);
            return new JavaScriptSerializer().Serialize(agendamento);
        }

        private static Componentes.Agendamento MontarAgenda(DataTable dt)
        {
            Componentes.Agendamento ag = new Componentes.Agendamento();
            ag.Cancelado = (bool)dt.Rows[0]["cancelado"];
            ag.Compareceu = (bool)dt.Rows[0]["compareceu"];
            ag.Data = (DateTime)dt.Rows[0]["data"];
            ag.Horario = (TimeSpan)(((DateTime)dt.Rows[0]["horario"]).TimeOfDay);
            ag.Termino = (TimeSpan)(((DateTime)dt.Rows[0]["termino"]).TimeOfDay);
            ag.Id_agenda = (long)dt.Rows[0]["id_agenda"];
            ag.IdCliente = (int)dt.Rows[0]["id_cliente"];
            ag.IdFuncionario = (int)dt.Rows[0]["id_funcionario"];
            ag.NomeCliente = (string)dt.Rows[0]["nome_cliente"];
            ag.NomeFuncionario = (string)dt.Rows[0]["nome_funcionario"];

            return ag;
        }
    }
}